package dao;

import java.io.Serializable;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import modelo.Contrato;
import modelo.Freelancer;
import modelo.Projeto;
import util.Util;


public class ContratoDAO implements Serializable {
    private final EntityManager manager;
    private final DAO<Contrato,Long> dao;
    
    public ContratoDAO(EntityManager manager) {
        this.manager = manager;
        dao = new DAO(manager,Contrato.class);
    }
    
    public List<Contrato> listar(){
        return dao.listar();
    }
    
    public Contrato consultar(Long id) {
        return dao.consultar(id);
    }
    
    public void inserir(Contrato contrato) {
        this.dao.inserir(contrato);
    }
    
    public Contrato atualizar(Contrato contrato) {
    	return this.dao.atualizar(contrato);   	
    }
    
    public List<Contrato> pesquisar(Contrato contrato) {
        String sql = "select contrato from Contrato contrato ";
        Map<String, Object> parametros = new HashMap<String, Object>();
        
        Projeto projeto = contrato.getProjeto();
        
        if (!Util.isNull(contrato.getDataInicio())) {
            int ano = contrato.getDataInicio().get(Calendar.YEAR);
            sql = dao.adicionarCondicao(sql, "year(contrato.dataInicio) = :pano ");
            parametros.put("pano", ano);
        }
        
        if (!Util.isNull(contrato.getStatus())) {
        	sql = dao.adicionarCondicao(sql, "contrato.status = :pstatus ");
            parametros.put("pstatus", contrato.getStatus());
        }
        
        if (!Util.isNull(contrato.getDonoProjeto())) {
        	sql = dao.adicionarCondicao(sql, "contrato.donoProjeto = :pdonoprojeto ");
            parametros.put("pdonoprojeto", contrato.getDonoProjeto());
        }
        
        if (!Util.isNull(contrato.getFreelancer())) {
        	sql = dao.adicionarCondicao(sql, "contrato.freelancer = :pfreelancer ");
            parametros.put("pfreelancer", contrato.getFreelancer());
        }
        
        
        if (!Util.isNull(projeto)) {
        	
        	if (!Util.isNull(projeto.getNome())) {
                sql = dao.adicionarCondicao(sql, " upper(contrato.projeto.nome) like upper(:pnome) ");
                parametros.put("pnome", "%" + projeto.getNome() + "%");
            }
        	
        	if (!Util.isNull(projeto.getCategoria())) {
                sql = dao.adicionarCondicao(sql, " contrato.projeto.categoria = :pcategoria ");
                parametros.put("pcategoria", projeto.getCategoria());
            }
        	      	
        	
        }
   

        Query consulta = manager.createQuery(sql);

        for (String parametro : parametros.keySet()) {

            consulta.setParameter(parametro, parametros.get(parametro));
        }

        return consulta.getResultList();
    }
    
    public List<Contrato> listContratoPorFreelancer(Freelancer freelancer) {
    	
    	
    	 String sql = "select contrato from Contrato contrato where contrato.freelancer =  :pfreelancer";
    	 
    	 Query consulta = manager.createQuery(sql);
    	 
    	 
    	 consulta.setParameter("pfreelancer",freelancer);
    	 return consulta.getResultList();
    	 
    	    	
    	
    }
    
    public Double calcularMedia(Freelancer freelancer) {
    	String sql = "select avg(contrato.avaliacao.nota) from Contrato contrato where contrato.freelancer =  :pfreelancer";
    	 
    	 Query consulta = manager.createQuery(sql);
    	 
    	 
    	 consulta.setParameter("pfreelancer",freelancer);
    	 return (Double) consulta.getSingleResult();
    }
    
}
    
